package fiuba.model;

import java.util.HashSet;
import java.util.Set;
import java.util.Date;

import fiuba.model.BaseObject;

import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FetchType;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Column;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.Transient;

import org.hibernate.annotations.Type;


@Entity
@SqlResultSetMapping(name="noticiadeseccion", entities=@EntityResult(entityClass=fiuba.model.Noticia.class))
@NamedNativeQuery(name="noticia.deseccion", query="select * from noticia n where n.seccion_fk IN (:secciones)"
		, resultSetMapping="noticiadeseccion")
public class Noticia extends BaseObject {
    /**
	 * 
	 */
	
	private static final long serialVersionUID = 1L;
	private Long id;
    private String autor;
    private String titulo;
    private String contenido;
    private String resumen;
    private Date fechaCreacion;
    private Date fechaBaja;
    private boolean publicada = false;
    private boolean estaBloqueado;
	private Seccion seccion; // A que seccion pertenece la noticia
    
    
    // FALTAN PALABRAS CLAVES - ASOCIADO
	private Set<PalabraClave> palabrasClaves = new HashSet<PalabraClave>();
    
	@Override
	public boolean equals(Object o) {
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return null;
	}
	@Id @GeneratedValue(strategy = GenerationType.AUTO) 
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	@Column(name="autor", length=30)
	public String getAutor() {
		return autor;
	}
	public void setAutor(String autor) {
		this.autor = autor;
	}
	@Column(name="titulo")
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	@Column(name="contenido")
	@Type(type="text")
	public String getContenido() {
		return contenido;
	}
	public void setContenido(String contenido) {
		this.contenido = contenido;
	}

	@Column(name="resumen")
	@Type(type="text")
	public String getResumen() {
		return resumen;
	}
	public void setResumen(String resumen) {
		this.resumen = resumen;
	}
	
	
	@ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
            name="noticia_palabraClave",
            joinColumns = { @JoinColumn( name="noticia_id") },
            inverseJoinColumns = @JoinColumn( name="palabraClave_id")
    )   	
	public Set<PalabraClave> getPalabrasClaves() {
		return palabrasClaves;
	}
	public void setPalabrasClaves(Set<PalabraClave> palabrasClaves) {
		this.palabrasClaves = palabrasClaves;
	}

	@Column(name="fecha")
	public Date getFechaCreacion() {
		return fechaCreacion;
	}
	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}
	@Column(name="fechabaja")
	public Date getFechaBaja() {
		return fechaBaja;
	}
	public void setFechaBaja(Date fechaBaja) {
		this.fechaBaja = fechaBaja;
	}
	
	@Column
	public boolean isPublicada() {
		return publicada;
	}
	public void setPublicada(boolean publicada) {
		this.publicada = publicada;
	}
	
    @Transient
	public boolean isEstaBloqueado() {
		return estaBloqueado;
	}
	public void setEstaBloqueado(boolean estaBloqueado) {
		this.estaBloqueado = estaBloqueado;
	}
	
	@ManyToOne
    @JoinColumn(name="seccion_fk")
	public Seccion getSeccion() {
		return seccion;
	}
	public void setSeccion(Seccion seccion) {
		this.seccion = seccion;
	}
	
	@Transient
	public String getContenidoCompleto() {
		return this.getResumen() + "<br>" +	this.getContenido();
	}
}
